package clases;

import java.awt.Image;
import java.awt.Toolkit;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.sql.*;
import java.text.DecimalFormat;
import java.text.DecimalFormatSymbols;
import java.text.SimpleDateFormat;
import javax.swing.DefaultComboBoxModel;
import javax.swing.JComboBox;
import javax.swing.table.*;
import java.util.Date;
import java.util.HashMap;
import java.util.Locale;
import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.ImageIcon;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import net.sf.jasperreports.engine.JRParameter;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperPrint;
import net.sf.jasperreports.view.JRViewer;

/**
 *
 * @author miguel mosquera tahua
 */
public class ClsMetodos {

    private ClsDatabase bd = new ClsDatabase();
    private ClsTabla clsTabla = new ClsTabla();

    /**
     *
     * @param md
     * @author sergio
     */
    public void tablaLimpia(javax.swing.table.DefaultTableModel md) {
        while (md.getRowCount() > 0) {
            md.removeRow(0);
        }
    }

    public void tablaLongitudColumnas(javax.swing.JTable table, int longitudes[]) {
        int ancho = 0;
        TableColumnModel mc = table.getColumnModel();
        TableColumn columnaTabla;
        for (int i = 0; i < table.getColumnCount(); i++) {
            columnaTabla = mc.getColumn(i);
            ancho = longitudes[i];
            columnaTabla.setPreferredWidth(ancho);
        }
    }

    public void tablaLlenaSimple(javax.swing.JTable jtable1, Object mat[]) {
        DefaultTableModel mdt = (DefaultTableModel) jtable1.getModel();
        tablaLimpia(mdt);
        //mdt.addRow(mat);
        //mdt.
    }

    public boolean tablaLlenaSql_antes(javax.swing.JTable jtable1, String sql, int n) {
        DefaultTableModel mdt = (DefaultTableModel) jtable1.getModel();

        tablaLimpia(mdt);
        boolean va = true;
        try {

            bd.getConnection();
            PreparedStatement pstm = bd.conn.prepareStatement(sql);

            ResultSet res = pstm.executeQuery();

            while (res.next()) {
                Object mat[] = new Object[n];
                for (int i = 0; i < n; i++) {
                    mat[i] = res.getString(i + 1);
                }
                mdt.addRow(mat);
            }
            res.close();
            clsTabla.packColumns(jtable1, 2);
        } catch (Exception e) {
            System.err.println("sql: " + e);
            //___________________________________________________________________________________ Soy una barra separadora :)
            e.printStackTrace();//Para eliminar, no deberia de estar, solo en modo desarrollo...
            ClsException._exceptionWriteFile(e, "tablaLlenaSql_antes");
        }
        System.out.println(sql);
        return va;
    }

    public void comboboxLlenar(JComboBox cb, DefaultComboBoxModel model, String sql) {
        model.removeAllElements();
        cb.removeAllItems();
        try {
            bd.getConnection();
            PreparedStatement pstm = bd.conn.prepareStatement(sql);
            System.out.println("combobox--> " + sql);
            ResultSet res = pstm.executeQuery();
            while (res.next()) {
                model.addElement(res.getString(1));
                cb.addItem(res.getString(2));
            }
            res.close();
        } catch (Exception e) {
            System.err.println(e);
            ClsException._exceptionWriteFile(e, "comboboxLlenar");
        }
        cb.setSelectedIndex(-1);
        cb.setPopupVisible(false);
    }

    public void comboboxLlenarMas(JComboBox cb, DefaultComboBoxModel model, String sql) {
        model.removeAllElements();
        cb.removeAllItems();
        try {
            bd.getConnection();
            PreparedStatement pstm = bd.conn.prepareStatement(sql);
            ResultSet res = pstm.executeQuery();
            model.addElement("");
            cb.addItem("Todos");
            while (res.next()) {
                model.addElement(res.getString(1));
                cb.addItem(res.getString(2));
            }
            res.close();
        } catch (Exception e) {
            System.err.println(e);
            ClsException._exceptionWriteFile(e, "comboboxLlenarMas");
        }
        cb.setSelectedIndex(0);
        cb.setPopupVisible(false);
    }

    /**
     * Metodo que nos permite ocultar una columna de un JTable
     *
     * @param tbl
     * @param columna
     */
    public void tablaOcultarcolumnas(javax.swing.JTable tbl, int columna[]) {
        for (int i = 0; i < columna.length; i++) {
            tbl.getColumnModel().getColumn(columna[i]).setMaxWidth(0);
            tbl.getColumnModel().getColumn(columna[i]).setMinWidth(0);
            tbl.getTableHeader().getColumnModel().getColumn(columna[i]).setMaxWidth(0);
            tbl.getTableHeader().getColumnModel().getColumn(columna[i]).setMinWidth(0);
        }
    }

    public void tablaRedondea(javax.swing.JTable tbl, int columna[]) {
        DefaultTableModel mdt = (DefaultTableModel) tbl.getModel();
        int n = mdt.getRowCount();
        String num;
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < columna.length; j++) {
                Object valor = mdt.getValueAt(i, columna[j]);
                if (valor != null) {
                    if (valor.equals("") == false) {
                        //System.out.println(valor);
                        num = redondeo_2(valor.toString().replace(",", ""));
                        mdt.setValueAt(num, i, columna[j]);
                    } else {
                        mdt.setValueAt("", i, columna[j]);
                    }

                } else {
                    mdt.setValueAt("", i, columna[j]);
                }

            }

        }
    }

    public void tablaNumeracion(javax.swing.JTable tbl, int columna[]) {
        DefaultTableModel mdt = (DefaultTableModel) tbl.getModel();
        int n = mdt.getRowCount();
        int num = 0;
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < columna.length; j++) {
                Object valor = mdt.getValueAt(i, columna[j]);
                if (valor != null) {
                    num = num + 1;
                    mdt.setValueAt(num, i, columna[j]);

                } else {
                    mdt.setValueAt("", i, columna[j]);
                }

            }

        }
    }

    public String generarCodigollaves(String sql, int tamanio) {
        String cdg = "";
        int valor = 0;
        try {
            System.out.println("codigo  " + sql);
            bd.getConnection();
            PreparedStatement pstm = bd.conn.prepareStatement(sql);
            ResultSet res = pstm.executeQuery();
            res = pstm.executeQuery(sql);
            while (res.next()) {
                valor = Integer.parseInt(res.getString(1));
            }
            res.close();
        } catch (Exception e) {
            System.out.println(e);
            ClsException._exceptionWriteFile(e, "generarCodigollaves");
        }
        valor = valor + 1;
        cdg = Integer.toString(valor);
        while (cdg.length() < tamanio) {
            cdg = "0" + cdg;
        }
        return cdg;
    }
    //___________________________________________________________________________________ Soy una barra separadora :)

    public boolean tablaLlenaSql(javax.swing.JTable table, String camposSelect, String sqlFromWhere) {
        DefaultTableModel mdt = (DefaultTableModel) table.getModel();
        tablaLimpia(mdt);
        boolean va = true;
        String sql = "SELECT " + camposSelect + " " + sqlFromWhere;
        int n = 0;
        try {
            bd.getConnection();
            PreparedStatement pstm = bd.conn.prepareStatement(sql);
            ResultSet res = pstm.executeQuery();

            //Previene que en camposSelect tenga: * o concat(   -->para obtener el numero de columnas
            if (camposSelect.trim().equals("*") || camposSelect.toLowerCase().indexOf("concat(") != -1) {
                ResultSetMetaData rsmd = res.getMetaData();
                n = rsmd.getColumnCount();
            } else {
                String colname[] = camposSelect.split(",");
                n = colname.length;
            }
//            System.err.println("n-Result-getColumnCount: "+String.valueOf(n));

            while (res.next()) {
                Object mat[] = new Object[n];
                for (int i = 0; i < n; i++) {
                    mat[i] = res.getString(i + 1);
                }
                mdt.addRow(mat);
            }
            res.close();
        } catch (Exception e) {
            System.err.println("sql: " + e);
            e.printStackTrace();
            ClsException._exceptionWriteFile(e, "tablaLlenaSql");
        }
        clsTabla.packColumns(table, 2);
        //System.out.println("tablaLlenaSql--> " + sql);
        return va;
    }

    public boolean tablaLlenaSql_defecto(javax.swing.JTable table, String camposSelect, String sqlFromWhere) {
        DefaultTableModel mdt = (DefaultTableModel) table.getModel();
        tablaLimpia(mdt);
        boolean va = true;
        String sql = "SELECT " + camposSelect + " " + sqlFromWhere;
        int n = 0;
        try {
            bd.getConnection();
            PreparedStatement pstm = bd.conn.prepareStatement(sql);
            ResultSet res = pstm.executeQuery();

            //Previene que en camposSelect tenga: * o concat(   -->para obtener el numero de columnas
//            if (camposSelect.trim().equals("*") || camposSelect.toLowerCase().indexOf("concat(") != -1) {
            ResultSetMetaData rsmd = res.getMetaData();
            n = rsmd.getColumnCount();
//            } else {
//                String colname[] = camposSelect.split(",");
//                n = colname.length;
//            }
//            System.err.println("n-Result-getColumnCount: "+String.valueOf(n));

            while (res.next()) {
                Object mat[] = new Object[n];
                for (int i = 0; i < n; i++) {
                    mat[i] = res.getString(i + 1);
                }
                mdt.addRow(mat);
            }
            res.close();
        } catch (Exception e) {
            System.err.println("sql: " + e);
            e.printStackTrace();
            ClsException._exceptionWriteFile(e, "tablaLlenaSql");
        }

//        System.out.println("tablaLlenaSql--> " + sql);
        return va;
    }
//___________________________________________________________________________________ Soy una barra separadora :)
    //Metodo usado para obtener la fecha actual
    //@return Retorna un <b>STRING</b> con la fecha actual formato "dd-MM-yyyy"

    public static String _getFechaActual() {
        Date ahora = new Date();
        SimpleDateFormat formateador = new SimpleDateFormat("yyyy-MM-dd");
        return formateador.format(ahora);
    }

    //Metodo usado para obtener la hora actual del sistema
    //@return Retorna un <b>STRING</b> con la hora actual formato "hh:mm:ss"
    //http://www.bibigeek.com/2009/03/03/las-fechas-en-java-i/
    public static String _getHoraActual() {
        Date ahora = new Date();
        SimpleDateFormat formateador = new SimpleDateFormat("HH:mm:ss a");
        return formateador.format(ahora);
    }

    public static String _getFechaHoraActual() {
        return _getFechaActual() + " " + _getHoraActual();
    }
    //___________________________________________________________________________________ Soy una barra separadora :)

    /**
     * Metodo que permite cerrar todo el Sistema
     */
    public void _cerrarSistema() {
        System.exit(0);//cerramos todo        
    }
    //___________________________________________________________________________________ Soy una barra separadora :)

    /**
     *
     * @param numero es el double a ser redondeado
     * @param digitos es la cantidad de decimales a redondear
     * @return double
     */
    public static double Redondear(double numero, int digitos) {
        int cifras = (int) Math.pow(10, digitos);
        return Math.rint(numero * cifras) / cifras;
    }

    /**
     *
     * @param numero es el double a ser redondeado
     * @param digitos es la cantidad de decimales a redondear
     * @return String
     */
    public static String Redondear_String(double numero, int digitos) {
        int cifras = (int) Math.pow(10, digitos);
        return String.valueOf(Math.rint(numero * cifras) / cifras);
    }
    //______________________________________________________________:)Soy una Barra Espaciadora

    /**
     * Metodo que permite colocar el icono ya establecido en cualquier JDialog
     *
     * @param dialog es el JDialog a colocar un Icon
     */
    public void _iconJDialog(JDialog dialog) {
        Image image = new ImageIcon(getClass().getResource("/resource/icon/principales/Logo.png")).getImage();
        //Para poner Icon en un JDialog
        ((java.awt.Frame) dialog.getOwner()).setIconImage(image);
//        this.setModal(true);
    }

    public void _iconJDialog(JFrame dialog) {
        Image image = new ImageIcon(getClass().getResource("/resource/icon/principales/Logo.png")).getImage();
        //Para poner Icon en un JDialog
        ((java.awt.Frame) dialog.getOwner()).setIconImage(image);
//        this.setModal(true);
    }

    /**
     * Metodo que permite colocar el icono en cualquier JDialog, estableciendo
     * la direccion (ruta) del icono Ej: "/resource/icon/principales/Logo.png"
     *
     * @param dialog es el JDialog a colocar un Icon
     */
    public void _iconJDialog(JDialog dialog, String direccionImagen) {
        Image image = new ImageIcon(getClass().getResource(direccionImagen)).getImage();
        //Para poner Icon en un JDialog
        ((java.awt.Frame) dialog.getOwner()).setIconImage(image);
//        this.setModal(true);
    }

    public boolean tablaLlenaSql_matriz(javax.swing.JTable table, String camposSelect, String sqlFromWhere, Object matrix[][]) {
        DefaultTableModel mdt = (DefaultTableModel) table.getModel();
        tablaLimpia(mdt);
        boolean va = true;
        String sql = "SELECT " + camposSelect + " " + sqlFromWhere;
        int n = 0;
        try {
            bd.getConnection();
            PreparedStatement pstm = bd.conn.prepareStatement(sql);
            ResultSet res = pstm.executeQuery();

            //Previene que en camposSelect tenga: * o concat(   -->para obtener el numero de columnas
            if (camposSelect.trim().equals("*") || camposSelect.toLowerCase().indexOf("concat(") != -1) {
                ResultSetMetaData rsmd = res.getMetaData();
                n = rsmd.getColumnCount();
            } else {
                String colname[] = camposSelect.split(",");
                n = colname.length;
            }
//            System.err.println("n-Result-getColumnCount: "+String.valueOf(n));
            int j = 0;
            while (res.next()) {
                Object mat[] = new Object[n];
                for (int i = 0; i < n; i++) {
                    mat[i] = res.getString(i + 1);
                    matrix[j][i] = mat[i];

                }
                mdt.addRow(mat);
                j++;
            }
            res.close();
        } catch (Exception e) {
            System.err.println("sql: " + e);
            e.printStackTrace();
            ClsException._exceptionWriteFile(e, "tablaLlenaSql_matriz");
        }
        clsTabla.packColumns(table, 2);
        System.out.println("tablaLlenaSql--> " + sql);
        return va;
    }

    public void arbol_llenar(javax.swing.JTree arbol, String camposSelect, String sqlFromWhere, String mat[][]) {

        boolean va = true;
        String sql = "SELECT " + camposSelect + " " + sqlFromWhere;
        int n = 0;
        try {
            bd.getConnection();
            PreparedStatement pstm = bd.conn.prepareStatement(sql);
            ResultSet res = pstm.executeQuery();

            //Previene que en camposSelect tenga: * o concat(   -->para obtener el numero de columnas
            if (camposSelect.trim().equals("*") || camposSelect.toLowerCase().indexOf("concat(") != -1) {
                ResultSetMetaData rsmd = res.getMetaData();
                n = rsmd.getColumnCount();
            } else {
                String colname[] = camposSelect.split(",");
                n = colname.length;
            }
//            System.err.println("n-Result-getColumnCount: "+String.valueOf(n));
            javax.swing.tree.DefaultMutableTreeNode treeNode1 = new javax.swing.tree.DefaultMutableTreeNode("Clasificación");
            javax.swing.tree.DefaultMutableTreeNode treeNode2 = null;
            javax.swing.tree.DefaultMutableTreeNode treeNode3 = null;
            javax.swing.tree.DefaultMutableTreeNode treeNode4;
            int i = 0, n1 = 0, n2 = 0, n3 = 0;
            String id_arbol = "";
            //mat=null;
            while (res.next()) {
                String id = res.getString(1);
                String nombre = res.getString(2);

                mat[i][0] = id;
                mat[i][1] = nombre;
                mat[i][2] = "";
                //System.out.println(id+" "+ nombre);
                if (id.length() == 2) {
                    treeNode2 = new javax.swing.tree.DefaultMutableTreeNode(nombre);
                    treeNode1.add(treeNode2);
                    //id_arbol="";
                    id_arbol = "." + Integer.toString(n1);
                    n2 = 0;
                    n3 = 0;
                    n1++;
                } else if (id.length() == 4) {
                    treeNode3 = new javax.swing.tree.DefaultMutableTreeNode(nombre);
                    treeNode2.add(treeNode3);
                    id_arbol = id_arbol.substring(0, 2) + "." + Integer.toString(n2);
                    n3 = 0;
                    n2++;
                } else if (id.length() == 6) {
                    treeNode4 = new javax.swing.tree.DefaultMutableTreeNode(nombre);
                    treeNode3.add(treeNode4);
                    treeNode2.add(treeNode3);
                    id_arbol = id_arbol.substring(0, 4) + "." + Integer.toString(n3);
                    n3++;
                }
                mat[i][2] = id_arbol;
                i++;
            }
            res.close();
            arbol.setModel(new javax.swing.tree.DefaultTreeModel(treeNode1));
        } catch (Exception e) {
            System.err.println("sql: " + e);
            e.printStackTrace();
            ClsException._exceptionWriteFile(e);
        }

        System.out.println("tablaLlenaSql--> " + sql);

    }

    public String redondeo_2(Object nun) {
        String val = nun.toString();
        if (val.trim().length() != 0) {
            BigDecimal big = new BigDecimal(val);
            big = big.setScale(2, RoundingMode.HALF_UP);
            val = "" + big;
            DecimalFormatSymbols simbolo = new DecimalFormatSymbols();
            simbolo.setDecimalSeparator('.');
            simbolo.setGroupingSeparator(',');
            DecimalFormat redondea = new DecimalFormat("#############,##0.00", simbolo);
            val = redondea.format(Double.parseDouble(val));
        }
        return val;
    }

    public String redondeo_3(Object nun, int n, boolean coma) {
        String val = nun.toString();
        if (val.trim().length() != 0) {
            BigDecimal big = new BigDecimal(val);
            big = big.setScale(n, RoundingMode.HALF_UP);
            val = "" + big;
            if (coma) {
                DecimalFormatSymbols simbolo = new DecimalFormatSymbols();
                simbolo.setDecimalSeparator('.');
                simbolo.setGroupingSeparator(',');
                DecimalFormat redondea = new DecimalFormat("#############,##0.00", simbolo);
                val = redondea.format(Double.parseDouble(val));
            }
        }
        return val;
    }

    public String redondeo_1(Object nun) {
        String val = nun.toString();
        if (val.trim().length() != 0) {
            BigDecimal big = new BigDecimal(val);
            big = big.setScale(2, RoundingMode.HALF_UP);
            val = "" + big;
        }
        return val;
    }

    public String num_s(String v) {
        //devuelve un numero en string
        String val = "";
        if (v.toString().trim().length() != 0) {
            val = v.replace(",", "");
        } else {
            val = "0";
        }
        return val;
    }

    public double num_d(String v) {
        //devuelve un numero en double
        double val = 0;
        val = Double.parseDouble(num_s(v));
        return val;
    }

    public void seleccionar_texto(JTextField txt) {
        txt.setSelectionStart(0);
        txt.setSelectionEnd(txt.getText().length());
    }

    public void seleccionar_tabla(JTable tb, int posicion, String valor) {
        //String ele = mat[0].toString();
        for (int i = 0; i < tb.getRowCount(); i++) {
            if (tb.getValueAt(i, posicion).equals(valor)) {
                tb.changeSelection(i, 1, false, false);
                break;
            }
        }
    }

    public void reporte_estandar(String ruta, String paramtros[], String titulo, int w, int h) {
        try {

            bd.getConnection();
            ruta="reportes\\"+ruta;

            Map p = new HashMap();

            //p.clear();
            for (int i = 0; i < paramtros.length; i++) {
                //System.out.println(paramtros[i] + " "+"p" + Integer.toString(i + 1));
                p.put("p" + Integer.toString(i + 1), paramtros[i]);
            }
            //

            //p.put("logo", me.logo_existe(var.departamento + var.provincia + var.distrito));

//            p.put(JRParameter.REPORT_LOCALE, new Locale("es", "ES"));
            p.put(JRParameter.REPORT_LOCALE, new Locale("en", "US"));
//            Locale locale = new Locale("es", "ES");

            JDialog viewer = new JDialog(new JFrame(), titulo, true);
            viewer.setSize(w, h);
            viewer.setLocationRelativeTo(null);
            JasperPrint reporte = JasperFillManager.fillReport(ruta, p, bd.conn);
            JRViewer jrv = new JRViewer(reporte);
            viewer.getContentPane().add(jrv);
            viewer.setIconImage(new ImageIcon(getClass().getResource("/resource/icon/principales/Logo.png")).getImage());
            viewer.show();

        } catch (Exception e) {
            System.out.println(e);
        }

    }

    public void fecha_date_choseser_devuelve(String tx, datechooser.beans.DateChooserCombo dateChooserCombo1) {
        try {
            String fecha = tx.substring(8, 10) + "/" + tx.substring(5, 7) + "/" + tx.substring(0, 4);// "12/10/2009";
            java.text.SimpleDateFormat formato = new java.text.SimpleDateFormat("dd/MM/yyyy");
            java.util.Date fechaDate = formato.parse(fecha);
            java.util.Calendar newDat = new java.util.GregorianCalendar();
            newDat.setTime(fechaDate);
            dateChooserCombo1.setSelectedDate(newDat);
        } catch (Exception e) {
            System.out.println("en fechas metodo " + e);
        }

    }

    public String fecha_date_choseser(String tx) {

        if (tx.length() == 7) {
            tx = "0" + tx;
        }
        String dia = tx.substring(0, 2);
        String mes = tx.substring(3, 5);
        String ano = tx.substring(6, 8);
        return ano + "/" + mes + "/" + dia;
    }

    public Object[][] cargar_matriz(String sql) {
        Object obj[][] = null;
        try {
            bd.getConnection();
            PreparedStatement pstm = bd.conn.prepareStatement(sql);

            ResultSet res = pstm.executeQuery();
            res.last();
            ResultSetMetaData rsmd = res.getMetaData();
            int numCols = rsmd.getColumnCount();
            int numFils = res.getRow();
            obj = new Object[numFils][numCols];
            int j = 0;
            res.beforeFirst();
            while (res.next()) {
                for (int i = 0; i < numCols; i++) {
                    obj[j][i] = res.getString(i + 1);
                    if (res.wasNull()) {
                        obj[j][i] = "";
                    }
                }
                j++;
            }
            res.close();
        } catch (Exception e) {
            System.out.println(e);
        }
//        System.out.println(sql);
        return obj;
    }

    /**
     * Se ejecuta un sonido conocido como beep() en el sistema
     */
    public void sonidoBeep() {
        Toolkit.getDefaultToolkit().beep();
    }

    public boolean verificar_procesados(String id_pro) {
        boolean seRepite = bd.verif_repite("SELECT idproyecto FROM presupuesto WHERE idproyecto='" + id_pro + "' and estado_nombre='Sin Procesar'");
        if (seRepite ) {
            JOptionPane.showMessageDialog(null, "Falta procesar todo el Presupuesto");
        }
        return seRepite;
        //Si no se repite
    }
}
